perm filename SAVE.THS[S,DOC] blob sn#100622 filedate 1974-05-03 generic text, type T, neo UTF8
	TITLE	SPYDER

	TTY==	0			;I/O CHANNEL FOR TTY
	T1==	1			;GENERAL PURPOSE ACS
	T2==	2
	T3==	3
	T4==	4
	T5==	5
	T6==	6
	T7==	7
	T10==	10
	NAME=	11			;OUR CURRENT JOB NAME
	THSTTY==12			;LAST TTY# DISPLAYED
	CHAR==	13			;I/O COMMUNICATION
	FLAG==	14			;LH = I/O CHNLS, RH=FLAGS
	THSCNL==15			;I/O CHANNEL COMMUNICATION
	P=	17			;PUSHDOWN LIST POINTER

	PDSIZ==	20			;VALUES
	ASCLIN==1
	.JBINT==134
	VALID==	1			;FLAGS
	TTYDPY==2
	NODPY==	4
	LOGCMD==10
	OFFLOG==20
	UPDATE==40
	FPD==	100

	LOC	.JBINT
	INTBLK
	RELOC

INTBLK:	4,,CNTRLC
	2
	BLOCK	2

CNTRLC:	TYPEC	ARRGH;			;↑C TRAPPING
	EXIT	1,			;BE NICE
	MOVEM	T1,TMP#			;BUT ALLOW CONTINUE
	SETZ	T1,
	EXCH	T1,INTBLK+2
	EXCH	T1,TMP			;WHERE SHE STOPS...
	JRSTF	@TMP
ST:	RESET				;FORCE OF HABIT
	TYPEC				;ISSUE A CRLF FOR MOTHER
	HRROI	T1,6
	GETTAB	T1,			;WHAT KIND OF PRIVS HAVE WE?
	TYPEC	%GETTAB FAILURE 1;	;SIGH...
	MOVEI	T2,41
	PEEK	T2,			;CAN WE PEEK?
	JUMPE	T2,[ERRT	?NO PRIVS,14,T1]
	MOVE	NAME,[SIXBIT/SPYDER/]	;THAT'S US
	MOVE	P,[IOWD	PDSIZ,PDLIST]	;INITIALIZE PDLST
	SETZB	FLAG,DPY		;HO HUM
	SETO	THSTTY,
	MOVE	T1,[DPY,DPY+1]		;CLEAR DPY & LOG FLAGS
	BLT	T1,LOG+2		;IN CORE, OF COURSE
	INIT	TTY,ASCLIN		;TTY IS INITED BECAUSE
	'TTY   '			;PROG MUST NOT BE HUNG IN
	OUTBUF,,0			;TO, SO LARGE BUFFER RING
	ERR	?NO TTY;		;PROVIDES LEEWAY
	TLO	FLAG,(1B0)		;MARK CH 0 IN USE
	OUTBUF	TTY,20			;BREATHING SPACE
	SETO	T1,
	GETLCH	T1			;GRAB BITS
	TLO	T1,(1B15)		;SET NO ECHO BIT
	SETLCH	T1			;TELL THE MONITOR
	ANDI	T1,177777		;SHUT OFF GARBAGE
	MOVEM	T1,MYTTY#		;BUT SAVE THE VITALS
	MOVE	T1,[30,,11]
	GETTAB	T1,			;FIND ADDRESS OF 1ST TTY CHUNK
	ERR	?GETTAB ERROR 2
	HRRZM	T1,CHBASE#
	MOVE	T1,[33,,11]		;FIND BASE ADDRESS OF LDB
	GETTAB	T1,			;TABLE (INDEXED BY LINE)
	ERR	?GETTAB ERROR 3
	HRRZM	T1,LINES#
	HLRE	T1,T1			;LH IS MAX # OF TTYS IN SYSTEM
	MOVMS	T1			;MAKE IT POSITIVE
	SUBI	T1,1			;FUDGE FACTOR
	MOVEM	T1,MAXTTY#
	MOVE	T1,[CHNLS,,CHNLS+1]
	SETZM	CHNLS
	BLT	T1,CHNLS+17		;ZERO TTY TO CHNL TABLE
	SETZM	ARGIN#			;INITIALIZE FOR CMD SCNR
	MOVE	T1,CHUNK		;COMPUTE LAST DIGIT
	IDIVI	T1,10			;OF ADDRESSES OF HEADER
	CAIL	T2,4			;WORDS OF TTY CHUNKS
	SUBI	T2,4			;COULD ALSO BE X+4
	MOVEM	T2,FUDGE#
	TYPEC	READY			;TELL READY AND FALL INTO LOOP
LOOP:	MOVE	T1,ARGIN		;CONT SCANNING LAST COMMAND
GRBCHR:	INCHRS	CHAR			;READ A CHARACTER
	JRST	NOCHRS			;SIGH
	CAIE	CHAR,175
	CAIN	CHAR,176
	JRST	CMDELI			;A DELIMITER! END OF CMD..
	CAIN	CHAR,33			;MUSN'T FORGET ALL ALTS
	JRST	CMDELI
	CAIL	CHAR,"0"
	CAIL	CHAR,"9"+1
	JRST	DELIM			;NOT A DIGIT...MAYBE OK
	TRON	FLAG,VALID		;A DIGIT IS ALWAYS WELCOME
	TRO	FLAG,TTYDPY		;IF NOTHING ELSE, DEFAULT
	LSH	T1,3			;MAKE ROOM FOR NEXT DIGIT
	ADDI	T1,-60(CHAR)		;ADD IT IN DISGUSTINGLY
	JRST	GRBCHR			;AND GO BACK FOR MORE
DELIM:	CAIN	CHAR,"+"		;DISPLAY A TTY?
	JRST	[			;;YES! SET FLAGS
	 TRCE	FLAG,VALID
	 JRST	BADCMD
	 TRO	FLAG,TTYDPY
	 JRST	GRBCHR]
	CAIN	CHAR,"-"		;REMOVE A TTY FROM DISPLAY?
	JRST	[
	 TRCE	FLAG,VALID
	 JRST	BADCMD
	 TRO	FLAG,NODPY
	 JRST	GRBCHR]
	CAIN	CHAR,"/"		;MAYBE WE SHOULD START LOGGING
	JRST	[
	 TRCE	FLAG,VALID
	 JRST	BADCMD
	 TRO	FLAG,LOGCMD
	 JRST	GRBCHR]
	CAIN	CHAR,"\"		;LAST CHANCE! STOP LOGGING?
	JRST	[
	 TRCE	FLAG,VALID
	 JRST	BADCMD
	 TRO	FLAG,OFFLOG
	 JRST	GRBCHR]
BADCMD:	MOVEI	CHAR,7			;OOPS - YOU LOSE
	OUTCHR	CHAR			;RING BELL TO COMPLAIN
	CLRBFI
	TRZ	FLAG,VALID		;CLEAR UP A DELUSION
	SETZB	T1,ARGIN		;WASH WALLS
	JRST	GRBCHR			;AND TRY AGAIN
CMDELI:	TRZN	FLAG,VALID		;DID WE LIKE THIS ONE?
	JRST	BADCMD			;OH WELL, TOO BAD
	SETZM	ARGIN			;CLEAN UP FOR NEXT TIME
	CAMG	T1,MAXTTY		;WAS THE NUMBER REASONABLE?
	CAMN	T1,MYTTY
	JRST	BADCMD			;NOT HARDLY
	JUMPL	T1,BADCMD		;THAT WOULD BE BIZZARE
	TRZE	FLAG,TTYDPY		;SKIP TO REMEMBER COMMAND
	JRST	NEWDPY
	TRZE	FLAG,NODPY
	JRST	REMDPY
	TRZE	FLAG,LOGCMD
	JRST	LOGIN
	TRZE	FLAG,OFFLOG
	JRST	LOGOUT
	ERR	%NO COMMAND GIVEN,LOOP
NOCHRS:	MOVEM	T1,ARGIN		;SAVE PARTIAL COMMAND
LFIN:	PUSHJ	P,DSPLYR		;UPDATE TTY
	PUSHJ	P,LOGGER		;UPDATE LOG FILES
	TLC	NAME,20			;NEW ALIAS
	SETNAM	NAME,
	MOVEI	T1,1
	SLEEP	T1,			;ZZZZZZZZZZZZZZZZZZZZZZ
	TRZE	FLAG,UPDATE		;DID WE DO ANYTHING?
	JRST	LOOP			;YES...FINE
	MOVEI	CHAR,7			;NO..COMPLAIN SO SLEEP TIME
	OUTCHR	CHAR			;CAN BE INCREASED
	JRST	LOOP			;THEN TRY AGAIN
NEWDPY:	PUSHJ	P,FIND			;ADDS TTY TO DISPLAY
	HRRM	T2,TWHERE(T1)		;STORE BP TO 1ST CHAR (INP)
	MOVEI	THSCNL,TTY		;IT'S TTY I/O TIME
	MOVEI	CHAR,CRLPAR
	PUSHJ	P,SEND			;FORMATTING
	OCTSND	0,T1			;PRINT TTY#
	MOVEI	CHAR,IPAR
	PUSHJ	P,SEND			;TELL INPUT FOLLOWS
	PUSHJ	P,FINDA			;SEND ALL WE CAN FIND
	HRLM	T2,TWHERE(T1)		;BP TO 1ST CHAR (OUTPUT)
	MOVEI	CHAR,CRLPAR		;SAME STORY
	PUSHJ	P,SEND
	OCTSND	0,T1
	MOVEI	CHAR,OPAR
	PUSHJ	P,SEND
	PUSHJ	P,FINDB			;PURGE OUTPUT BUFFER TO TTY
	MOVE	THSTTY,T1		;REMEMBER WHO WE SENT LAST
	MOVE	T2,T1			;SET THIS TTY'S DISPLAY FLAG
	IDIVI	T2,44
	MOVE	T4,DPY(T2)
	ROT	T4,1(T3)
	TRO	T4,1
	MOVNS	T3
	ROT	T4,-1(T3)
	MOVEM	T4,DPY(T2)
	JRST	LFIN			;GO FINISH MAIN LOOP

REMDPY:	MOVE	T2,T1			;REMOVES A TTY FROM DISPLAY
	IDIVI	T2,44			;ALL YOU NEED TO DO IS
	MOVE	T4,DPY(T1)		;CLEAR ITS DISPLAY BIT
	ROT	T4,1(T3)
	TRZ	T4,1
	MOVNS	T3
	ROT	T4,-1(T3)
	MOVEM	T4,DPY(T2)
	JRST	LFIN			;AND THENCE TO GREECE
LOGIN:	MOVE	T2,T1			;ADDS TTY TO LOGGER
	IDIVI	T2,44			;FIRST, CHECK IF TTY IS ON
	MOVE	T4,LOG(T2)		;ALREADY
	LSH	T4,1(T3)
	TRNE	T4,1
	ERRT	%ALREADY LOGGING,0,T1,BADCMD
	MOVSI	T2,-17			;NOW, TRY TO FIND A FREE CNL
FREFND:	ROT	FLAG,1			;BY CHECKING LH OF FLAG
	TROE	FLAG,1
	JRST	FRECNL
	AOBJN	T2,FREFND
	CTYPEC	%NO FREE CHANNELS;	;GREEDY, ISN'T HE?
	JRST	BADCMD
FRECNL:	HRRZ	THSCNL,T2		;SAVE THE # OF THE FREE CHNL
	MOVNI	T2,(T2)			;RESTORE FLAG REGISTER
	ROT	FLAG,-1(T2)
	MOVE	T2,THSCNL		;SETUP OPEN BLOCK
	IMULI	T2,3			;SPECIFICALLY, THE BUF HDR
	MOVEI	T2,OUTBUF(T2)
	HRLZM	T2,OPNBLK+2
	MOVE	T2,THSCNL		;CALCULATE OPEN INSTRUCTION
	LSH	T2,27
	ADD	T2,[OPEN	OPNBLK]
	XCT	T2			;DISGUSTING, ISN'T IT?
	ERRT	%DISK OPEN FAILURE ON CHNL,0,THSCNL,BADCMD
	MOVEI	T2,177			;NOW CALCULATE FILENAME
	SUB	T2,THSCNL		;FNAM= 177-TTY#
	MOVEI	T4,222000		;FOR A LITTLE OBSCURITY
	SETZ	T3,			;CONVERT TO SIXBIT
	REPEAT	3,<
	 ROTC	T2,-3
	 ROTC	T3,-3>
	MOVEM	T3,.+4			;PUT FILENAME IN LKP BLOCK
	FILSET	3,<0,FILENM,TMP>
	MOVE	T2,THSCNL
	LSH	T2,27
	ADD	T2,[LOOKUP	FILE]
	XCT	T2			;LOOKUP FILE
	PUSHJ	P,ANYWAY		;IF NOT THERE, CREATE & LKP
	MOVEM	T3,.+4			;NOW DO ENTER FOR UPDATE MODE
	FILSET	4,<0,FILENM,TMP,<777000,,0>>
	MOVE	T2,THSCNL		;PROTECT IT WELL
	LSH	T2,27
	ADD	T2,[ENTER	FILE]
	XCT	T2			;ENTER DISGUSTINGLY
	ENTERR
	MOVE	T2,THSCNL		;NOW DO USETI TO APPEND
	LSH	T2,27
	ADD	T2,[USETI	-1]
	XCT	T2			;I HATE THIS..
	MOVEI	CHAR,[ASCIZ/
*************
(/]
	PUSHJ	P,SEND			;TO SEPERATE ENTRIES
	OCTSND	0,T1
	MOVEI	CHAR,IPAR
	PUSHJ	P,SEND			;NOW THAT IT'S FORMATTED..
	PUSHJ	P,FIND			;DUMP THE INPUT BUFFER
	HRRM	T2,DWHERE(T1)
	PUSHJ	P,FINDA
	HRLM	T2,DWHERE(T1)
	MOVEI	CHAR,CRLPAR		;MORE FORMATTING
	PUSHJ	P,SEND
	OCTSND	0,T1
	MOVEI	CHAR,OPAR
	PUSHJ	P,SEND
	PUSHJ	P,FINDB			;DUMP OUTPUT BUFFER
	MOVEI	CHAR,STARS		;NOW MARK ST OF ON-LINE
	PUSHJ	P,SEND
	MOVE	T2,T1			;SET LOGGING BIT FOR THIS TTY
	IDIVI	T2,44
	MOVE	T4,LOG(T2)
	ROT	T4,1(T3)
	TRO	T4,1
	MOVNS	T3
	ROT	T4,-1(T3)
	MOVEM	T4,LOG(T2)
	MOVEM	T1,CHNLS(THSCNL)	;REMEMBER TTY ON THIS CHANNEL
	JRST	LFIN			;AND GO FLY A KITE